/*
 * TDS PEC 4
 * Grupo 3H2M

 * Luis Rodríguez-Manzaneque Sánchez
 *
 * El paquete <code>edu.uoc.tds.pec4.aulas</code> contiene todos los módulos 
 * relativos al subsistema Aulas, tanto la parte de la interfaz gráfica de la 
 * aplicación cliente, como el interfaz e implementación del objeto remoto que
 * provee de servicios a la GUI.
 */
package edu.uoc.tds.pec4.aulas;

import edu.uoc.tds.pec4.beans.AulaDTO;
import edu.uoc.tds.pec4.beans.SolicitudDTO;
import edu.uoc.tds.pec4.common.components.TablaUI;
import edu.uoc.tds.pec4.common.util.Cabecera;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import edu.uoc.tds.pec4.common.validation.ValidarGUI;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;

/**
 * La clase <code>DialogAsignacionAula</code> representa la interfaz de usuario 
 * para la asignación de aulas.<br />
 *
 * Interficie de usuario para la asignación de un aula a una solicitud y la
 * creación de la reserva
 *
 * @author	Luis Rodríguez-Manzaneque Sánchez
 * @version	10/12/2011
 */
public class DialogAsignacionAula extends javax.swing.JDialog {

    /** sol es el objeto DTO de la solicitud */
    private SolicitudDTO sol;

    /** aulas es el listado de aulas */
    private List<AulaDTO> aulas;
    
    /** aulaSelec el identificador del aula seleccionada */
    private AulaDTO aulaSelec = null;
    
    //====================================================== campos
    //... componentes gráficos
    private JScrollPane jScrollPane = null;
    //Contendra la consulta obtenida, en formato grid
    private TablaUI TablaConsulta = null;

    /** Creates new form DialogAsignacionAula */
    public DialogAsignacionAula(java.awt.Frame parent, boolean modal,
            SolicitudDTO sol, List<AulaDTO> aulas) {
        super(parent, TDSLanguageUtils.getMessage("aulas.asignacion.aulas.titulo")
                + " " + sol.getIdSolicitud(), modal);

        this.sol = sol;
        this.aulas = aulas;
        initComponents();

        inicializarComponentes();

        setLabels();

        // Recargo las filas en la tabla
        TablaConsulta.setFilas(getFilasTabla(aulas));
        TablaConsulta.refrescarFilas();

        //Centramos la ventana en la pantalla
        UtilidadesGUI.centrarVentana(this,JOptionPane.getFrameForComponent(this));
    }

    public AulaDTO getAulaSelec() {
        return aulaSelec;
    }

    /**
     * Inicializa y situa los componentes de la GUI
     */
    private void inicializarComponentes() {

        PanelAulas.add(getJScrollPane(), null);
    }

    /**
     * Establece las etiquetas en función de la internacionalización
     */
    private void setLabels() {
        String sTituloPanel;

        sTituloPanel = TDSLanguageUtils.getMessage("aulas.asignacion.aulas.panel");
        sTituloPanel = sTituloPanel.replace("#1", sol.getNomCiudad());
        sTituloPanel = sTituloPanel.replace("#2", UtilidadesGUI.obtenerFecha(sol.getFechaIni()));
        sTituloPanel = sTituloPanel.replace("#3", UtilidadesGUI.obtenerFecha(sol.getFechaFin()));
        if (!sol.getDiaCompleto()) {
            sTituloPanel = sTituloPanel.replace("#4", UtilidadesGUI.obtenerHora(sol.getHoraIni())
                    + " - " + UtilidadesGUI.obtenerHora(sol.getHoraFin()));
        } else {
            sTituloPanel = sTituloPanel.replace("#4", TDSLanguageUtils.getMessage("aulas.asignacion.aulas.diacompleto"));
        }
        
        labelFiltro.setText(sTituloPanel);
        
        PanelAulas.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("aulas.asignacion.aulas.diacompleto"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        cmdAsignarAula.setText(TDSLanguageUtils.getMessage("aulas.asignacion.aulas.boton.asignar"));
        cmdCerrar.setText(TDSLanguageUtils.getMessage("aulas.asignacion.aulas.boton.cerrar"));

    }

    /**
     * Este método inicializa el botón Asignar aula
     *
     * @return javax.swing.JButton
     */
    private JButton getCmdAsignarAula() {
        if (cmdAsignarAula == null) {
            cmdAsignarAula = new JButton();
            cmdAsignarAula.setText(TDSLanguageUtils.getMessage("aulas.asignacion.aulas.boton.asignar"));
            cmdAsignarAula.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    cmdAsignarAulaActionPerformed(e);
                }
            });
        }
        return cmdAsignarAula;
    }

    /**
     * Método que maneja el evento sobre el botón de asignar aula.<br />
     * Realiza la operación de mostrar el diálogo de asignación de aula
     */
    private void cmdAsignarAulaActionPerformed(ActionEvent e) {
        int fila = TablaConsulta.getSelectedRow();
        if (fila > -1) {
            if (ValidarGUI.isInteger(TablaConsulta.getModel().getValueAt(fila, 0).toString())) {
                
                String sConfirm = TDSLanguageUtils.getMessage("aulas.asignacion.aulas.confirm.asignaraula");
                sConfirm=sConfirm.replace("#1", TablaConsulta.getModel().getValueAt(fila, 0).toString());
                sConfirm=sConfirm.replace("#2", sol.getIdSolicitud().toString());
                
                // Preguntamos al usuario si está seguro de asignar el aula
                int confirmado = JOptionPane.showConfirmDialog(this,sConfirm,
                        TDSLanguageUtils.getMessage("aulas.aviso"),
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.QUESTION_MESSAGE);
                
                // Comprobamos su respuesta
                if (JOptionPane.OK_OPTION == confirmado) {
                    // Recuperamos el idAula seleccionada
                    aulaSelec = aulas.get(fila);
                    // Salimos
                    cmdCerrarActionPerformed(null);
                }
            }
        } else {
            // Avisamos que no se ha seleccionado ningún aula
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("aulas.asignacion.aulas.err.noselecaula"),
                    TDSLanguageUtils.getMessage("aulas.aviso"),
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Este método inicializa el botón Cerrar
     *
     * @return javax.swing.JButton
     */
    private JButton getCmdCerrar() {
        if (cmdCerrar == null) {
            cmdCerrar = new JButton();
            cmdCerrar.setText(TDSLanguageUtils.getMessage("aulas.asignacion.aulas.boton.cerrar"));
            cmdCerrar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    cmdCerrarActionPerformed(e);
                }
            });
        }
        return cmdCerrar;
    }

    /**
     * Método que maneja el evento sobre el botón de Cerrar.<br />
     * Realiza la operación de cierre del dialogo
     */
    private void cmdCerrarActionPerformed(ActionEvent e) {
        dispose();
    }

    /**
     * Este método inicializa jScrollPane
     *
     * @return javax.swing.JScrollPane
     */
    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new Rectangle(10, 20, 565, 180));
            jScrollPane.setViewportView(getTablaConsulta());
        }
        return jScrollPane;
    }

    /**
     * This method initializes TablaConsulta
     *
     * @return javax.swing.JTable
     */
    private JTable getTablaConsulta() {
        if (TablaConsulta == null) {
            TablaConsulta = new TablaUI(getCabecerasTabla(), getFilasTabla(new ArrayList<AulaDTO>()));
            TablaConsulta.setLocation(new Point(0, 0));
            TablaConsulta.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
        return TablaConsulta;
    }

    /**
     * Genera las cabeceras de las columnas tabla. El mapa de cabeceras es una
     * estructura de tipo diccionario que implementa pares clave-valor, siendo la
     * clave la posición de la columna y el valor la columna, en concreto un objeto
     * de tipo Cabecera que a su vez lleva el nombre de la columna y su ancho
     *
     * @return  Un objeto <code>Map<Cabecera, Integer></code> que mantiene un
     *          diccionario con todas las columnas de la tabla, su posición y
     *          tamaño.
     */
    private List<Cabecera> getCabecerasTabla() {
        // La Cabecera indica el nombre de columna y tamaño
        List<Cabecera> vCabecera = new ArrayList<Cabecera>();

        // Recordar: Cabecera (titulo, anchoColumna)

        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.codigo"), 50));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.espacio"), 140));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.direccion"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.superficie"), 60));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.aforo"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.preciohora"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.preciodia"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.aulas.panel.porcentcancel"), 90));

        return vCabecera;
    }

    /**
     * A partir de una lista de objetos, devuelve listas de listas de objetos para
     * que se puedan mostrar en una tabla
     *
     * @return javax.swing.JTable
     */
    private List<List> getFilasTabla(List<AulaDTO> vCv) {
        List<List> aulas = new ArrayList<List>();

        try {
            List<Integer> vId = new ArrayList<Integer>();
            List<String> vNombre = new ArrayList<String>();
            List<String> vDireccion = new ArrayList<String>();
            List<Double> vSuperficie = new ArrayList<Double>();
            List<Integer> vAforo = new ArrayList<Integer>();
            List<Double> vPrecioHora = new ArrayList<Double>();
            List<Double> vPrecioDia = new ArrayList<Double>();
            List<Double> vPorcentCancel = new ArrayList<Double>();
            for (AulaDTO cv : vCv) {
                vId.add(cv.getIdAula());
                vNombre.add(cv.getNomAula());
                vDireccion.add(cv.getDireccion());
                vSuperficie.add(cv.getSuperficie());
                vAforo.add(cv.getAforo());
                vPrecioHora.add(cv.getPrecioHora());
                vPrecioDia.add(cv.getPrecioDia());
                vPorcentCancel.add(cv.getPorcentCancelacion());
            }
            aulas.add(vId);
            aulas.add(vNombre);
            aulas.add(vDireccion);
            aulas.add(vSuperficie);
            aulas.add(vAforo);
            aulas.add(vPrecioHora);
            aulas.add(vPrecioDia);
            aulas.add(vPorcentCancel);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("aulas.consulta.aulas.err.filas") + Constantes.SL
                    + e.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.aulas.error"),
                    JOptionPane.ERROR_MESSAGE);
        }

        return aulas;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        PanelAulas = new javax.swing.JPanel();
        cmdCerrar = getCmdCerrar();
        cmdAsignarAula = getCmdAsignarAula();
        labelFiltro = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        PanelAulas.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Relación de aulas disponibles", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelAulas.setName(""); // NOI18N

        javax.swing.GroupLayout PanelAulasLayout = new javax.swing.GroupLayout(PanelAulas);
        PanelAulas.setLayout(PanelAulasLayout);
        PanelAulasLayout.setHorizontalGroup(
            PanelAulasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 568, Short.MAX_VALUE)
        );
        PanelAulasLayout.setVerticalGroup(
            PanelAulasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 177, Short.MAX_VALUE)
        );

        cmdCerrar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        cmdCerrar.setText("Volver");

        cmdAsignarAula.setText("jButton1");

        labelFiltro.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        labelFiltro.setText("jLabel1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelFiltro)
                    .addComponent(PanelAulas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(cmdAsignarAula)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 384, Short.MAX_VALUE)
                        .addComponent(cmdCerrar, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(labelFiltro, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(PanelAulas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cmdAsignarAula)
                    .addComponent(cmdCerrar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    /**
     * @param args the command line arguments
     */
//    public static void main(String args[]) {
//        java.awt.EventQueue.invokeLater(new Runnable() {
//
//            public void run() {
//                DialogAsignacionAula dialog = new DialogAsignacionAula(new javax.swing.JFrame(), true);
//                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
//
//                    public void windowClosing(java.awt.event.WindowEvent e) {
//                        System.exit(0);
//                    }
//                });
//                dialog.setVisible(true);
//            }
//        });
//    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel PanelAulas;
    private javax.swing.JButton cmdAsignarAula;
    private javax.swing.JButton cmdCerrar;
    private javax.swing.JLabel labelFiltro;
    // End of variables declaration//GEN-END:variables
}
